/**
 * \file stack.h
 * \brief Stack - FILO em memória
 *
 * Estrutura de dados que segue a metedologia FILO (First In Last Out)
 */
# ifndef STACK_DEFINITION
# define STACK_DEFINITION

# include <stdlib.h>
# include "linked-list.h"

typedef struct {
	LinkedList *list;
} Stack;
/**
 * \func Stack * newStack()
 * \brief Cria uma nova Stack (aloca espaço em memória)
 * \return Nova Stack
 *
 * Esta função pode crashar o programa se não houver memória suficiente.
 */
Stack * newStack();
/**
 * \func void * pop(Stack *stack)
 * \brief Tira um elemento da stack (o elemento do topo)
 * \return O elemento ou NULL
 * Se a stack estiver vazia retorna NULL
 */
void * pop(Stack *stack);
/**
 * \func void * top(Stack *stack)
 * \brief Le o primeiro elemento da stack
 * \return O elemento do topo ou NULL
 */
void * top(Stack *stack);
/**
 * \func int push(Stack *stack, void *data)
 * \brief Adiciona o elemento à stack (ao topo)
 * \param stack Stack à qual adicionar
 * \param data Elemento a adicionar
 * \return 0 se não conseguiu 1 se conseguiu
 *
 * Esta função pode causar uma saida inesperada do programa,
 * porque usa a função LinkedList * newElem()
 */
int push(Stack *stack, void *data);

// Funções para conversao entre dados
/**
 * \func LinkedList * stackToLinkedList (Stack *stack)
 * \brief Passa de Stack para LinkedLinkedList
 * \param stack Stack a transformar em linked-list
 * \return Linked-LinkedList ou NULL
 */
LinkedList * stackToLinkedList (Stack *stack);
/**
 * \func Stack * linkedLinkedListToStack (List *list)
 * \brief Passa de linked-list para Stack
 * \param list LinkedLista a trasformar
 * \return Stack ou NULL
 */
Stack * linkedLinkedListToStack (LinkedList *list);

# endif
